/**
 * desc : WebSocket Chat Server
 * User : hjt
 * Date : 2017/1/5
 */

//npm install ws --save-dev 安装nodejs的websocket 它的用法和html5中的websocket一模一样
var WebSocket = require("ws");
var WebSocketServer = WebSocket.Server;
var wss = new WebSocketServer({port : 8080});

//npm install ws --save-dev
var uuid = require("node-uuid");

//定义一个存放访问进来的一个数组
//数组的长度要有下限
var clientWs = [];
//用来记录新用户的连接个数
var clientIndex = 1;
//每次进入的客户端都是一个全新的ws对象，聊天室是广播的行为
wss.on("connection", function(ws){
    ///生成uuid
    var clientUUID = uuid.v4();
    //用户昵称
    var nickname = " 【新用户" + clientIndex + "】";

    if(clientWs.length >= 100){
        //TODO 策略：把存在时间长的用户从数组中移除， serInterval conut==0  设置超时时间30分钟
    }

    //存放每一个ws的客户端websocket对象
    clientWs.push({
        id : clientUUID,
        ws : ws,
        nickname : nickname,
        time : new Date().toLocaleString(),
        count : 0
    });

    console.log(nickname + "客户端连上了...");
    clientIndex ++ ;

    sendMessage("advice", clientUUID, nickname, nickname + "进入聊天室了");
    //监听客户端发送过来的数据
    ws.on("message", function(message){
        //更名操作
        if(message.indexOf("mk_") != -1){
            var nicknameArr = message.split("_");
            if(nicknameArr.length >= 2){
                //记录原来的名字
                var oldName = nickname;
                //新名字
                nickname = nicknameArr[1];
                var nickmessgae = oldName + "更名为：【 " + nickname +  " 】 " ;
                sendMessage("upname", clientUUID, nickname, nickmessgae);
            }
        } else {
            console.log("客户端发过来的消息是:" + message);
            sendMessage("message", clientUUID, nickname, message);
        }
    });

    //监听每一个用户关闭浏览器，在聊天室中通知，用户离开信息，同时把clientWs数组中对应的ws用户删除
    ws.on("close", function(){
        closeSocket(clientUUID,nickname,"");
        //console.log("检查是否删除成功..."+clientWs.length);
    });

    //监听进程关闭
    process.on("SIGNT", function(){
        console.log("服务器被关了....");
        closeSocket(0,"mk","服务器被挂起....");
        process.exit();
    });

});


/*关闭连接*/
function closeSocket(uuid,nickname,message){
    var len = clientWs.length;
    if(len > 0){
        for (var i = 0; i < len; i++) {
            //获取每一个客户端的ws对象
            if(clientWs[i].id == uuid){
                sendMessage("leave",uuid,nickname,message);
                //删除服务器数组中的位置 ,数组中索引为i的元素删除,1代表的删除的个数 ,splice删除会改变数组的长度
                clientWs.splice(i,1);
            }
        }
    }
};

//广播所有的客户端发送消息
/*
 type:代表发送的类型：新用户进入，更名，离开
 * */
function sendMessage(type,uuid,nickname,message){
    var len = clientWs.length;
    if(len > 0){
        for (var i = 0; i < len; i++) {
            //获取每一个客户端的ws对象
            var cws = clientWs[i].ws;
            if(cws.readyState === WebSocket.OPEN){//代表当前客户端保持连接和打开状态的用户发送消息
                cws.send(JSON.stringify({
                    "type":type,
                    "id":uuid,
                    "nickname":nickname,
                    "message":message
                }));
            }
        }
    }
}
